home *** CD-ROM | disk | FTP | other *** search
/ Power CD / Power CD ATARI-Rechner Lieben.iso / DEMOS / HM2_DEMO / BSP / SAMPLE.CPX / SAMPLE.M < prev    next >
Encoding:
Text File  |  1992-10-08  |  7.2 KB  |  297 lines

  1. MODULE SampleCPX;
  2. (*
  3.  * ein etwas komplexeres Beispiel für die CPX-Programmierung.
  4.  *
  5.  * Folgendes wird demonstriert:
  6.  *        - prinzipielles Dialog-Handling
  7.  *        - Slider-Verwaltung
  8.  *        - Popup-Verwaltung
  9.  *        - Datensegment und Daten sichern
  10.  *        - Tastaturbedienbarkeit
  11.  *        - Verwaltung mehrerer Objektbäume
  12.  *        - Embedding einer größeren Resource-Datei
  13.  *)
  14.  
  15. IMPORT AES, TOS, CPX, evnt, graf,objc, RSC, rsCPX, Str;
  16. FROM SYSTEM IMPORT ADR, ADDRESS;
  17.  
  18. TYPE
  19.     tIt = ARRAY[0..11] OF CHAR;
  20.     tMI = ARRAY[0..4] OF tIt;
  21.  
  22.     tpSave = POINTER TO tSave;
  23.     tSave = RECORD
  24.         cur_item,
  25.         vcur_item,
  26.         hcur_item: SHORTINT;
  27.     END;
  28.  
  29. CONST
  30.     AAAA = 0;
  31.     INIT_VALUE = 6;
  32.  
  33.     NUM_ITEMS = 5;
  34.  
  35.     VIS_ITEMS = 10;
  36.     MAX_ITEMS = 50;
  37.     MIN_ITEMS = 0;
  38.  
  39.     menu_items = tMI{
  40.      "A. Alich   ",
  41.      "J. Reiß    ",
  42.      "C. Sprenger",
  43.      "T. Uhl     ",
  44.      "= MoSys GbR"};
  45.  
  46. VAR
  47.     Save: tSave;
  48.  
  49.     blanks: ARRAY[0..4],[0..30] OF CHAR;
  50.     blank:    ARRAY[0..4] OF ADDRESS;
  51.  
  52.     NULLFUNC: PROC;
  53.  
  54.     vcur_text,
  55.     hcur_text: ARRAY[0..3] OF CHAR;
  56.     Main,
  57.     Help,
  58.     Tree: objc.tpTree;
  59.  
  60. PROCEDURE initialize();
  61. BEGIN
  62.     WITH CPX.pXCPB^ DO
  63.         Save := tpSave(TOS.DATA)^;
  64.  
  65.         Main^[RSC.POPUP].tedinfo^.ptext := ADR(menu_items)
  66.          + ORD(Save.cur_item*SIZE(menu_items[0]));
  67.  
  68.         vcur_text := FORM(Save.vcur_item);
  69.         Main^[RSC.SLIDEV].tedinfo^.ptext := ADR(vcur_text);
  70.         Sl_y(Main, RSC.BASEV, RSC.SLIDEV, Save.vcur_item,
  71.             MAX_ITEMS, MIN_ITEMS, NULLFUNC);
  72.         Sl_size(Main, RSC.BASEV, RSC.SLIDEV, MAX_ITEMS-MIN_ITEMS+1,
  73.             VIS_ITEMS, CPX.Vertical, 16);
  74.  
  75.         hcur_text := FORM(Save.hcur_item);
  76.         Main^[RSC.SLIDEH].tedinfo^.ptext := ADR(hcur_text);
  77.         Sl_x(Main, RSC.BASEH, RSC.SLIDEH, Save.hcur_item,
  78.             MIN_ITEMS, MAX_ITEMS, NULLFUNC);
  79.         Sl_size(Main, RSC.BASEH, RSC.SLIDEH, MAX_ITEMS-MIN_ITEMS+1,
  80.             VIS_ITEMS, CPX.Horizontal, 16);
  81.     END
  82. END initialize;
  83.  
  84. PROCEDURE Pop_Handle(Tree: objc.tpTree;
  85.                                      button: SHORTINT;
  86.                                         items: ARRAY OF tIt;
  87.                                 num_items: SHORTINT;
  88.                          default_item: SHORTINT;
  89.                                 font_size: SHORTINT): SHORTINT;
  90. VAR
  91.     butn, world: AES.tRect;
  92.     i: SHORTINT;
  93. BEGIN
  94.     butn := Tree^[button].pos;
  95.     objc.offset(Tree,button,butn.x,butn.y);
  96.     world := Tree^[0].pos;
  97.     objc.offset(Tree,0,world.x,world.y);
  98.  
  99.     FOR i:=0 TO num_items-1 DO
  100.         blanks[i] := '  ';
  101.         Str.Concat(blanks[i], items[i]);
  102.         Str.Concat(blanks[i], '  ');
  103.         blank[i] := ADR(blanks[i])
  104.     END;
  105.     RETURN CPX.pXCPB^.Popup(ADR(blank), num_items, default_item, font_size,
  106.         butn, world)
  107. END Pop_Handle;
  108.  
  109. (*$E+*)
  110. PROCEDURE VDraw();
  111. VAR
  112.     rect: AES.tRect;
  113. BEGIN
  114.     vcur_text := FORM(Save.vcur_item);
  115.     rect := Tree^[RSC.SLIDEV].pos;
  116.     objc.offset(Tree,RSC.SLIDEV,rect.x,rect.y);
  117.     objc.draw(Tree,RSC.SLIDEV,16,rect);
  118. END VDraw;
  119.  
  120. PROCEDURE HDraw();
  121. VAR
  122.     rect: AES.tRect;
  123. BEGIN
  124.     hcur_text := FORM(Save.hcur_item);
  125.     rect := Tree^[RSC.SLIDEH].pos;
  126.     objc.offset(Tree,RSC.SLIDEH,rect.x,rect.y);
  127.     objc.draw(Tree,RSC.SLIDEH,16,rect);
  128. END HDraw;
  129. (*$E=*)
  130.  
  131. PROCEDURE Redraw(VAR new: objc.tpTree);
  132. VAR
  133.     rect: AES.tRect;
  134.     draw: AES.tpRect;
  135. BEGIN
  136.     WITH CPX.pXCPB^ DO
  137.         new^[0].pos := Tree^[0].pos;
  138.         Tree := new;
  139.         objc.offset(Tree,0,rect.x,rect.y);
  140.         draw := GetFirstRect(rect);
  141.         WHILE draw#NIL DO
  142.             objc.draw(Tree,0,16,draw^);
  143.             draw := GetNextRect();
  144.         END
  145.     END
  146. END Redraw;
  147.  
  148. PROCEDURE handle_button(button: SHORTINT; VAR msg: evnt.tMsg): BOOLEAN;
  149. VAR
  150.     click_flag: BOOLEAN;
  151.     quit: BOOLEAN;
  152.     ox,oy,obj: SHORTINT;
  153.     rect: AES.tRect;
  154.     mk: CPX.tMRets;
  155.     mf: graf.tMForm;
  156. BEGIN
  157.     WITH CPX.pXCPB^ DO
  158.         quit := FALSE;
  159.         click_flag := (button<-1);
  160.         IF click_flag THEN
  161.             button := SHORTINT(BITSET(button)*{0..14});
  162.         END;
  163.         IF button=-1 THEN
  164.             CASE msg.type OF
  165.             |evnt.Close,     (* AC_CLOSE -> Cancel *)
  166.              evnt.Closed:  (* WM_CLOSED -> Ok *)
  167.                 IF msg.type=evnt.Closed THEN
  168.                     tpSave(TOS.DATA)^ := Save
  169.                 END;
  170.                 quit := TRUE
  171.             |evnt.CT_Key:
  172.                 IF Tree=Main THEN
  173.                     IF msg.key.scan=CHR(62H) THEN (* HELP *)
  174.                         Redraw(Help)
  175.                     ELSIF msg.key.scan=CHR(61H) THEN (* UNDO *)
  176.                         quit := TRUE
  177.                     END
  178.                 END
  179.             ELSE
  180.             END
  181.         ELSIF Tree=Main THEN
  182.             CASE button OF
  183.             |RSC.SAVE:
  184.                 tpSave(TOS.DATA)^ := Save;
  185.                 IF XGen_Alert(CPX.SaveDefaults)
  186.                 & ~CPX_Save(TOS.DATA,SIZE(Save)) THEN
  187.                     VOID(XGen_Alert(CPX.FileErr))
  188.                 END;
  189.                 objc.change(Tree,RSC.SAVE,Tree^[0].pos,{},TRUE);
  190.             |RSC.CANCEL,
  191.              RSC.QUIT:
  192.                 IF button=RSC.QUIT THEN
  193.                     tpSave(TOS.DATA)^ := Save
  194.                 END;
  195.                 quit := TRUE;
  196.                 EXCL(Tree^[button].state,objc.Selected)
  197.             |RSC.HELP:
  198.                 EXCL(Tree^[RSC.HELP].state,objc.Selected);
  199.                 Redraw(Help)
  200.             |RSC.POPUP:
  201.                 obj := Pop_Handle(Tree, RSC.POPUP, menu_items, NUM_ITEMS, Save.cur_item, objc.SystemFont);
  202.                 IF obj#-1 THEN
  203.                     Save.cur_item := obj;
  204.         (*            Tree^[RSC.POPUP].tedinfo^.ptext := ADR(menu_items[cur_item]);*)
  205.                     Tree^[RSC.POPUP].tedinfo^.ptext := ADR(menu_items)
  206.                      + ORD(Save.cur_item*SIZE(menu_items[0]));
  207.                 END;
  208.                 EXCL(Tree^[RSC.POPUP].state,objc.Selected);
  209.                 rect := Tree^[RSC.POPUP].pos;
  210.                 objc.offset(Tree, RSC.POPUP, rect.x, rect.y);
  211.                 objc.draw(Tree, RSC.POPUP, 16, rect);
  212.             |RSC.UP:
  213.                 Sl_arrow(Tree,RSC.BASEV, RSC.SLIDEV, RSC.UP, -1, MAX_ITEMS, MIN_ITEMS,
  214.                     Save.vcur_item, CPX.Vertical, VDraw)
  215.             |RSC.DOWN:
  216.                 Sl_arrow(Tree,RSC.BASEV, RSC.SLIDEV, RSC.DOWN, 1, MAX_ITEMS, MIN_ITEMS,
  217.                     Save.vcur_item, CPX.Vertical, VDraw)
  218.             |RSC.BASEV:
  219.                 graf.mkstate(mk.x,mk.y,mk.buttons,mk.kstate);
  220.                 objc.offset(Tree,RSC.SLIDEV,ox,oy);
  221.                 IF mk.y<oy THEN ox := -VIS_ITEMS ELSE ox := VIS_ITEMS END;
  222.                 Sl_arrow(Tree,RSC.BASEV, RSC.SLIDEV, -1, ox, MAX_ITEMS, MIN_ITEMS,
  223.                     Save.vcur_item, CPX.Vertical, VDraw)
  224.             |RSC.SLIDEV:
  225.                 MFsave(CPX.Save,mf);
  226.                 graf.mouseform(graf.FlatHand);
  227.                 Sl_dragy(Tree, RSC.BASEV, RSC.SLIDEV, MAX_ITEMS, MIN_ITEMS,
  228.                     Save.vcur_item, VDraw);
  229.                 MFsave(CPX.Restore,mf);
  230.             |RSC.LEFT:
  231.                 Sl_arrow(Tree,RSC.BASEH, RSC.SLIDEH, RSC.LEFT, -1, MIN_ITEMS, MAX_ITEMS,
  232.                     Save.hcur_item, CPX.Horizontal, HDraw)
  233.             |RSC.RIGHT:
  234.                 Sl_arrow(Tree,RSC.BASEH, RSC.SLIDEH, RSC.RIGHT, 1, MIN_ITEMS, MAX_ITEMS,
  235.                     Save.hcur_item, CPX.Horizontal, HDraw)
  236.             |RSC.BASEH:
  237.                 graf.mkstate(mk.x,mk.y,mk.buttons,mk.kstate);
  238.                 objc.offset(Tree,RSC.SLIDEH,ox,oy);
  239.                 IF mk.x<ox THEN oy := -VIS_ITEMS ELSE oy := VIS_ITEMS END;
  240.                 Sl_arrow(Tree,RSC.BASEH, RSC.SLIDEH, -1, oy, MIN_ITEMS, MAX_ITEMS,
  241.                     Save.hcur_item, CPX.Horizontal, HDraw)
  242.             |RSC.SLIDEH:
  243.                 MFsave(CPX.Save,mf);
  244.                 graf.mouseform(graf.FlatHand);
  245.                 Sl_dragx(Tree, RSC.BASEH, RSC.SLIDEH, MIN_ITEMS, MAX_ITEMS,
  246.                     Save.hcur_item, HDraw);
  247.                 MFsave(CPX.Restore,mf);
  248.             ELSE
  249.             END;
  250.         ELSIF Tree=Help THEN
  251.             IF button=RSC.HOK THEN
  252.                 EXCL(Tree^[RSC.HOK].state,objc.Selected);
  253.                 Redraw(Main)
  254.             END
  255.         END;
  256.     END;
  257.     RETURN quit
  258. END handle_button;
  259.  
  260. (*$E+*)(*$K+*)
  261. PROCEDURE cpx_call (VAR work: AES.tRect): SHORTINT;
  262. VAR
  263.     button: SHORTINT;
  264.     quit: BOOLEAN;
  265.     msg: evnt.tMsg;
  266. BEGIN
  267.     WITH Main^[0].pos DO x := work.x; y := work.y; END;
  268.     WITH Help^[0].pos DO x := work.x; y := work.y; END;
  269.     initialize();
  270.     Tree := Main;
  271.     objc.draw (Tree, 0, 8, work);
  272.     quit := FALSE;
  273.     REPEAT
  274.         button := CPX.pXCPB^.Xform_do (Tree, 0, msg);
  275.         quit := handle_button(button, msg)
  276.     UNTIL quit;
  277.     CPX.Terminate;
  278.     RETURN 0
  279. END cpx_call;
  280. (*$E=*)(*$K=*)
  281.  
  282. BEGIN
  283.     LONGCARD(NULLFUNC) := 0;
  284.     WITH CPX.pXCPB^ DO
  285.         IF booting # 0 THEN
  286.             CPX.Return (CPX.tpCpxInfo(1))
  287.         END;
  288.         IF SkipRshFix = 0 THEN
  289.             rsCPX.relocate(RSC.Data,RSC.Trees);
  290.             Main := RSC.Trees^[0];
  291.             Help := RSC.Trees^[1]
  292.         END;
  293.         CPX.CpxInfo.cpx_call := cpx_call;
  294.         CPX.Return (ADR (CPX.CpxInfo))
  295.     END;
  296. END SampleCPX.
  297.         
  298.     
  299.